package org.firefly.tool.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FreemarkerWriter {

	private static final Map<String, Template> templateMap = new HashMap<String, Template>();

	/**
	 * 模板初始化
	 * 
	 * @param ftlPath
	 * @param ftlName
	 * @return
	 */
	public static Template getTemplate(String ftlPath, String ftlName) {
		// 创建一个模板对象
		Template template = templateMap.get(ftlName);
		if (template == null) {
			Configuration cfg = new Configuration();
			// 设置模板文件使用的字符集,一般就是UTF-8
			cfg.setDefaultEncoding("UTF-8");
			try {
				// 设置模板文件所在的路径
				cfg.setDirectoryForTemplateLoading(new File(ftlPath));
				// 加载模板对象
				template = cfg.getTemplate(ftlName, "UTF-8");
				templateMap.put(ftlPath, template);
			} catch (Exception e) {
				System.err.println("ftl template create e:{}" + e);
			}
		}
		return template;
	}

	/**
	 * 输出到文件
	 * 
	 * @param template
	 * @param sourceData
	 * @param targetFile
	 * @throws Exception
	 */
	public static void getFile(Template template, Object sourceData, File targetFile) throws Exception {
		// 文件输出
		Writer out = new FileWriter(targetFile);
		// 调用模板对象的process方法输出文件。
		template.process(sourceData, out);
		// 刷新流
		out.flush();
		// 关闭流
		out.close();
	}

	/**
	 * 输出到字符串
	 * 
	 * @param template
	 * @param sourceData
	 * @param targetData
	 * @return
	 * @throws Exception
	 */
	public static String getString(Template template, Object sourceData, String targetData) throws Exception {
		StringWriter sw = new StringWriter();
		try {
			template.process(sourceData, sw);
			sw.flush();
		} catch (Exception e) {
			System.err.println("拼装上线报文异常：" + e);
			sw = null;
		} finally {
			try {
				sw.close();
			} catch (IOException e) {
				System.err.println("拼装上线报文异常：" + e);
			}
		}
		return sw.toString();
	}

}
